﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RecommendatioNetwork;


namespace  ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Model MyModel = new Model();
           
            Console.WriteLine("Sei connesso su "+MyModel.MyRepository.IPserver);
            Console.WriteLine("Seleziona la porta su cui ti vuoi connettere");
            string st = Console.ReadLine();
            int port = int.Parse(st);
            MyModel.MyRepository.Configuration.Port = port;
            Console.WriteLine("Start Server");
            MyModel.InitializeCommunication();
            Console.WriteLine("Server Started on" + MyModel.MyRepository.MyUri);
            while (true) {
                Console.WriteLine("\n\n0: Esci \n1: Salva ed esci\n2: Visualizza/Rimuovi nodi amici\n3: Inserisci nodi\n4: Inserisci un commento\n5: Visualizza i miei commenti\n6: Cerca\n7: Visualizza i risultati delle mie ricerche ");
                int i=10; 
                string s = Console.ReadLine();
                try
                {   
                    i = int.Parse(s);
                }
                catch (Exception) { Console.WriteLine("Carattere non consentito"); }
                switch (i)
                {
                    case 0:
                        return;
                    case 1:
                        MyModel.SaveModel();
                        return;
                    case 2:
                        Console.WriteLine("\nNodi Amici:\n");
                        int q = 0;
                        List<Uri> list = new List<Uri>();
                        foreach (KeyValuePair<Uri, Ranking> kvp in MyModel.MyRepository.UrisRank) {
                            list.Add(kvp.Key);
                            Console.WriteLine(q+++":"+kvp.Key.Host);
                        }
                        Console.WriteLine("Scrivi il numero dell'amico che vuoi eliminare, altrimenti per uscire premere Enter");
                        string ss = Console.ReadLine();
                        try
                        {
                            int j = Int16.Parse(ss);
                            MyModel.MyRepository.UrisRank.Remove(list[j]);
                        }
                        catch (Exception) { continue; }
                        continue;
                    case 3:
                        Console.WriteLine("Inserisci l'Indirizzo IP della persona che vuoi aggiungere");
                        string Address = Console.ReadLine();
                        Console.WriteLine("Inserisci la porta della persona che vuoi aggiungere");
                        string Porta = Console.ReadLine();
                        try
                        {
                            UriBuilder ubuild = new UriBuilder("http", Address, Int16.Parse(Porta), MyModel.MyConfiguration.ServiceName);
                            MyModel.MyRepository.UrisRank.Add(ubuild.Uri, new Ranking(MyModel.MyConfiguration) {  Request=1,Response=1,RequestFailed=0});
                        }
                        catch (Exception) { continue; }
                        Console.WriteLine("Inserimento avvenuto correttamente, premere un tasto per continuare");
                        Console.ReadLine();
                        continue;
                    case 4:
                       Console.WriteLine("Scrivi la tipologia");
                       string typ = Console.ReadLine();
                       Console.WriteLine("Scrivi il titolo");
                       string titolo = Console.ReadLine();
                       Console.WriteLine("Scrivi il commento");
                       string commento = Console.ReadLine();
                       Comment c = new Comment(MyModel.MyRepository.MyPeer, typ, titolo, commento, 3);
                       MyModel.MyRepository.MyComments.Add(c);
                       Console.WriteLine("Commento salvato");
                       continue;
                    case 5:
                       foreach (Comment comment in MyModel.MyRepository.MyComments) {
                           Console.WriteLine(comment.ToString());
                       }
                       continue;
                    case 6:
                       Console.WriteLine("Inserisci la tipologia da cercare");
                       string typs = Console.ReadLine();
                       Console.WriteLine("Scrivi il titolo da cercare");
                       string titolos = Console.ReadLine();
                       Search search = new Search(MyModel) { Typology=typs,TextSearched=titolos, TypeOfSearch="Titolo e testo"};
                       MyModel.MySender.SearchComments(search);
                       Console.WriteLine("Ricerca avviata correttamente, premere un tasto per continuare");
                       Console.ReadLine();
                       continue;
                    case 7:
                       foreach (KeyValuePair<Search, List<Comment>> kvp in MyModel.MyRepository.ActiveSearch) {
                           Console.WriteLine("Testo Cercato:" + kvp.Key.TextSearched);
                           foreach (Comment comment in kvp.Value) {
                               Console.WriteLine(comment.ToString());
                           }
                       }
                       continue;

                    default:
                        continue;

                }
            }
            
        }
    }
}
